package tinglema.server.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.web.multipart.MultipartFile;
import tinglema.server.common.R;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import tinglema.server.constants.Constants;
import tinglema.server.entity.domain.Singer;
import tinglema.server.service.ObjectStoreService;
import tinglema.server.service.SingerService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;

/**
 * 歌手表(Singer)表控制层
 *
 * @author delucia
 * @since 2025-03-28 10:09:10
 */
@RestController
@RequestMapping("singer")
public class SingerController {
    /**
     * 服务对象
     */
    @Resource
    private SingerService singerService;

    @Resource
    private ObjectStoreService oss;

    /**
     * 分页查询所有数据
     *
     * @param page   分页对象
     * @param singer 查询实体
     * @return 所有数据
     */
    @GetMapping
    public R selectAll(Page<Singer> page, Singer singer) {
        page.setMaxLimit(100L);
        return R.success(this.singerService.page(page, new QueryWrapper<>(singer)));
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("{id}")
    public R selectOne(@PathVariable Serializable id) {
        return R.success(this.singerService.getById(id));
    }

    /**
     * 新增数据
     *
     * @param singer 实体对象
     * @return 新增结果
     */
    @PostMapping("add")
    public R insert(@RequestBody Singer singer) {
        return R.success(this.singerService.save(singer));
    }

    /**
     * 修改数据
     *
     * @param singer 实体对象
     * @return 修改结果
     */
    @PutMapping("update")
    public R update(@RequestBody Singer singer) {
        return R.success(this.singerService.updateById(singer));
    }


    /**
     * 更新歌手头像
     *
     * @param avatarFile 表示上传的文件
     * @param singerId   歌手ID，用于指定需要更新头像的歌手记录
     * @return 包含操作结果的R对象，若操作成功则data字段携带更新后的头像信息
     */
    @PostMapping("avatar/update")
    public R updateAvatar(@RequestParam("file") MultipartFile avatarFile, @RequestParam("id") int singerId) {

        // 设定存储的目录
        // File parentDir = new File(Constants.SINGER_PIC_PATH);

        // 如果目录不存在则创建对应目录
        // if (!parentDir.exists() && !parentDir.mkdirs()) {
        //如果目录创建失败了
        // return R.fatal("目录不存在");
        // }
        // 父目录存在
        // String saveFileName = System.currentTimeMillis() + '-' + avatarFile.getOriginalFilename();
        // String saveFileName = avatarFile.getOriginalFilename();
        String parentDir = "img/singerPic";
        // String avatarPath = Constants.SINGER_PIC_PATH + saveFileName;
        // String avatarPath = parentDir + saveFileName;
        // File dest = new File(avatarPath);


        try {
            // avatarFile.transferTo(dest);
            // 更新数据库中歌手头像字段的值对相应的路径

            // saveFileName = oss.uploadFile(avatarPath, saveFileName, avatarFile);
            String saveFileName = oss.uploadFile(parentDir, System.currentTimeMillis() + '-' + avatarFile.getOriginalFilename(), avatarFile);
            Singer singer = new Singer();
            singer.setId(singerId);
            singer.setPic(saveFileName);
            boolean isUpdated = singerService.updateById(singer);
            if (!isUpdated) {
                return R.fatal("图片上传失败");
            }
            // 更新数据库中歌手头像字段的值对相应的路径
            return R.success("图片上传成功", parentDir + saveFileName);
        } catch (IOException e) {
            e.printStackTrace();
            return R.fatal("文件上传失败");
        }
    }


    /**
     * 删除数据
     *
     * @param id 主键
     * @return 删除结果
     */
    @DeleteMapping("delete")
    public R delete(@RequestParam("id") Long id) {
        return R.success(this.singerService.removeById(id));
    }
}